﻿using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Data.SqlClient;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;
using GeneralLibs;
using CustomSecurity;
using Lists;
using ListForms;
using BasicForms;
using BarCode;
using System.IO;
using System.Diagnostics;

namespace Portal
{
    public partial class FrmPortal : BasicForms.FrmBase
    {
        public FrmPortal()
        {
            InitializeComponent();

            DevExpress.LookAndFeel.UserLookAndFeel.Default.SetSkinStyle("Office 2007 Blue");
        }

        private void btnBanHangLe_Click(object sender, EventArgs e)
        {
            BanLe.FrmEditHoaDonBanLe frm = new BanLe.FrmEditHoaDonBanLe();
            frm.Show();
        }

        private void btnCauHinh_Click(object sender, EventArgs e)
        {
            FrmCacCauHinh frm = new FrmCacCauHinh();
            frm.Show();
        }

        private void FrmPortal_Load(object sender, EventArgs e)
        {
            if (DesignMode) return;

            FirstInstall();

            SetGUI();
            try
            {
                //Hiện phiên bản trước để có lỗi thì vẫn nhìn thấy phiên bản
                lblVersion.Text = string.Format("Phiên bản: {0}", System.Reflection.Assembly.GetExecutingAssembly().GetName().Version);
                Lists.ThongTinPhu.PhienBan = System.Reflection.Assembly.GetExecutingAssembly().GetName().Version.ToString();
                Lists.Store store = Lists.DanhMucStore.Instance.GetByStoreID(Config.StoreID);
                //Nếu không có store thì bắt phải nhập. Vì rất nhiều thứ cần dùng.
                if(store == null)
                {
                    FrmWarning.Show("Thông báo", "Phần mềm chưa được cấu hình thông tin cửa hàng (Store). Hãy nhập thông số cửa hàng để phần mềm có thể hoạt động");
                    FrmSetStoreID frm = new FrmSetStoreID();
                    if(frm.ShowDialog () != DialogResult.OK)
                    {
                        FrmWarning.Show("Thông báo", "Phần mềm không thể hoạt động nếu không có cấu hình thông số cửa hàng");
                        Application.Exit();
                        return;
                    }
                }
                //Nếu có thì set Tag để biết là store nào
                store = Lists.DanhMucStore.Instance.GetByStoreID(Config.StoreID);
                this.Tag = "FrmPortal," + store.Ten;

                if (store != null) lblVersion.Text = string.Format("Phiên bản: {0} - {1}", System.Reflection.Assembly.GetExecutingAssembly().GetName().Version, store.Ten);
                else lblVersion.Text = string.Format("Phiên bản: {0}", System.Reflection.Assembly.GetExecutingAssembly().GetName().Version);

                #region ThietLap DangKy hoac lay ten may 
                LocalSettings.HeThong.HardwareID = CommonLib.GetMacAddressID();
                MayTinh mayTinh = DanhMucMayTinh.Instance.GetByHardwareID(LocalSettings.HeThong.HardwareID);
                if (mayTinh == null)
                {
                    mayTinh = DanhMucMayTinh.Instance.NewDoiTuong();
                    mayTinh.HardwareID = LocalSettings.HeThong.HardwareID;
                    mayTinh.Ten = System.Security.Principal.WindowsIdentity.GetCurrent().Name;
                    mayTinh.GenSoMayBaseOnDB();
                    mayTinh.InsertToDB();
                }
                LocalSettings.HeThong.SoMay = mayTinh.GetSoMay();
                GeneralLibs.LocalSettings.HeThong.Save2File();
                #endregion

                if (LocalSettings.HeThong.AutoLogin)
                {
                    User.CurUser = User.Login(LocalSettings.HeThong.TenTruyCap, LocalSettings.HeThong.Password);
                    if (User.CurUser != null)
                    {
                        NhatKySuDung.Insert2DB("Đăng nhập", "hệ thống");
                    }
                }
                else
                {
                    LoginLogout();
                }
                SetGUI();
            }
            catch (Exception ex)
            {
                BasicForms.FrmExceptionNotifier.ShowAndLog(ex);
            }
        }
        
        private bool CheckLicence()
        {
            try
            {
                while (true)
                {
                    string inputSerial = LocalSettings.HeThong.SerialKey;

                    string actualCpuSerial = CommonLib.MaHoaMD5("Accounting" + CommonLib.MaHoaMD5("Accounting" + CommonLib.GetMacAddressID())) + "C";
                    if (inputSerial == actualCpuSerial)
                    {
                        return true;
                    }

                    string actualCompanyNameSerial = CommonLib.MaHoaMD5("Accounting" + Config.TenDoanhNghiep) + "B";
                    if (inputSerial == actualCompanyNameSerial)
                    {
                        if (CommonLib.GetSystemDateTime() > LocalSettings.HeThong.HanSuDung)
                        {
                            MessageBox.Show("Sản phẩm đã hết hạn sử dụng");
                            return false;
                        }
                        else
                        {
                            return true;
                        }
                    }

                    FrmSerial frmSerial = new FrmSerial();
                    if (frmSerial.ShowDialog() != DialogResult.OK)
                    {
                        return false;
                    }
                }
            }
            catch (Exception ex)
            {
                BasicForms.FrmExceptionNotifier.ShowAndLog(ex);
                return false;
            }
        }
        public void LoginLogout()
        {
            try
            {
                if (User.CurUser == null)//login
                {
                    while (true)
                    {
                        try
                        {
                            FrmLogin frmLogin = new FrmLogin();
                            if (frmLogin.ShowDialog() == DialogResult.OK)
                            {
                                SqlConnection con = new SqlConnection(LocalSettings.ConnectString);
                                try
                                {
                                    con.Open();
                                }
                                catch (Exception ex)
                                {
                                    MessageBox.Show("Không thể kết nối đến cơ sở dữ liệu", "Lỗi đăng nhập");
                                }

                                Lists.Store store = Lists.DanhMucStore.Instance.GetByStoreID(Config.StoreID);
                                if (store != null) lblVersion.Text = string.Format("Phiên bản: {0} - {1}", System.Reflection.Assembly.GetExecutingAssembly().GetName().Version, store.Ten);
                                else lblVersion.Text = string.Format("Phiên bản: {0}", System.Reflection.Assembly.GetExecutingAssembly().GetName().Version);

                                try
                                {
                                    User.CurUser = User.Login(frmLogin.UserName, frmLogin.Password);
                                    if (User.CurUser != null)
                                    {
                                        //NhatKySuDung.Insert2DB("Đăng nhập", "hệ thống");
                                        break;
                                    }
                                }
                                catch (Exception ex)
                                {
                                    MessageBox.Show(ex.Message, "Lỗi đăng nhập");
                                }
                            }
                            else
                            {
                                break;
                            }
                        }
                        catch (Exception loginEx)
                        {
                            MessageBox.Show(loginEx.Message, "Lỗi đăng nhập");
                        }
                    }
                    //if (!CheckLicence()) return;
                }
                else//logout
                {
                    while (Application.OpenForms.Count > 1)
                    {
                        foreach (Form form in Application.OpenForms)
                        {
                            if (form != this)
                            {
                                form.Close();
                                break;
                            }
                        }
                    }
                    User.CurUser = null;
                }
                SetGUI();
            }
            catch (Exception ex)
            {
                BasicForms.FrmExceptionNotifier.ShowAndLog(ex);
            }
            //

        }
        private void SetGUI()
        {
            if (User.CurUser != null)
            {
                btnHeThong.Visible = false;
                btnMaVach.Enabled = true;
                btnBanLe.Enabled = true;
                btnKinhDoanh.Enabled = true;
                lblDangNhap.Text = "Đăng xuất";
            }
            else
            {
                btnHeThong.Visible = true;
                btnHeThong.Enabled = false;
                btnMaVach.Enabled = false;
                btnBanLe.Enabled = false;
                btnKinhDoanh.Enabled = false;
                lblDangNhap.Text = "Đăng nhập";
            }
        }

        private void FirstInstall() 
        {
           
            //Khi cài đặt phần mềm, bộ cài sẽ tạo ra 1 file tên: "" trong thư mục cài đặt.
            //Nếu lần đầu mở phần mềm sau khi cài đặt --> hỏi xem có tạo tự động CSDL k.
            //Dù có hay k thì cũng xóa file này đi. Từ các lần sau check k thấy file thì k hỏi nữa.
            string path = string.Format("{0}\\First.srmdep", Application.StartupPath);
            if (File.Exists(path) &&
                MessageBox.Show("Phần mềm mới được cài đặt.\nBạn có muốn tạo CSDL mới?", "Thông tin cài đặt lần đầu", MessageBoxButtons.YesNo,
                MessageBoxIcon.Question, MessageBoxDefaultButton.Button1) == DialogResult.Yes) //Tồn tại file này và đồng ý tạo mới CSDL
	        {
                //Tạo CSDL tự động
                FrmCreateDatabase frm = new FrmCreateDatabase();
                frm.ShowDialog();
               
                File.Delete(path); //Xong thì kiểu gì cũng xóa để lần sau k hỏi lại
	        }
        }

        private void EncryptFile()
        {
            OpenFileDialog openFile = new OpenFileDialog();
            openFile.ShowDialog();
            if (openFile.FileNames.Length > 0)
            {
                foreach (string filename in openFile.FileNames)
                {
                    LocalSettings.EncryptTextFromOneFileToDATFile(filename, "BlanhDB_SQL");
                }
            }
        } 

        protected override bool ProcessCmdKey(ref Message msg, Keys keyData)
        {
            try
            {
                switch (keyData)
                {
                    case Keys.F1:
                        GeneralLibs.CommonLib.ShowHelp(this.Name);
                        break;

                    case Keys.Control | Keys.L:
                    case Keys.Control | Keys.D:
                        LoginLogout();
                        break;

                    //Some hide functions
                    case Keys.Control | Keys.Shift | Keys.Alt | Keys.C:
                        FrmCauHinhCoSoDuLieu frmCauHinhCoSoDuLieu = new FrmCauHinhCoSoDuLieu();
                        frmCauHinhCoSoDuLieu.Show();
                        break;
                    case Keys.Control | Keys.Shift | Keys.Alt | Keys.A:
                        FrmEditThongSoAnChoDeveloper frm = new FrmEditThongSoAnChoDeveloper();
                        frm.Show();
                        break;
                    case Keys.Control | Keys.Shift | Keys.Alt | Keys.E:
                        EncryptFile();
                        break;
                }
                return base.ProcessCmdKey(ref msg, keyData);
            }
            catch (Exception ex)
            {
                BasicForms.FrmExceptionNotifier.ShowAndLog(ex);
                return false;
            }
        }

        private void btnMaVach_Click(object sender, EventArgs e)
        {
            FrmBarCode frm = new FrmBarCode();
            frm.Show();
        }

        private void btnBanLe_Click(object sender, EventArgs e)
        {
            Right right = User.CurUser.GetRight(btnBanLe.Tag.ToString());
            if (right == CustomSecurity.Right.None) return;

            BasicForms.FrmProgressBar.StartShowProgress();

            int desksHeights = Screen.PrimaryScreen.Bounds.Height;
            int desksWidths = Screen.PrimaryScreen.Bounds.Width;

            try
            {
                if (ModifierKeys == Keys.Control)
                {
                    BanLe.FrmDanhSachHoaDonBanLe frm = new BanLe.FrmDanhSachHoaDonBanLe();
                    frm.Show();
                }
                else
                {
                    if (desksHeights <= 768 && desksWidths <= 1025)
                    {
                        BanLe.FrmEditHoaDonBanLe frm = new BanLe.FrmEditHoaDonBanLe();
                        frm.Show();
                    }
                    else //if (760 <= desksHeights && 1024 <= desksWidths && desksWidths <= 1367)
                    {
                        BanLe.FrmEditHoaDonBanLe1366x768 frm = new BanLe.FrmEditHoaDonBanLe1366x768();
                        frm.Show();
                    }
                }
            }
            catch (Exception ex)
            {
            }
            BasicForms.FrmProgressBar.FinishShowProgress();
        }

        private void btnKinhDoanh_Click(object sender, EventArgs e)
        {

            BasicForms.FrmProgressBar.StartShowProgress();
            FrmKinhDoanh frm = new FrmKinhDoanh();
            frm.Show();

            BasicForms.FrmProgressBar.FinishShowProgress();
        }

        private void btnClose_Click(object sender, EventArgs e)
        {
            this.Close();
        }

        private void btnConfigDatabase_Click(object sender, EventArgs e)
        {
           
        }

        private void lblDangNhap_LinkClicked(object sender, LinkLabelLinkClickedEventArgs e)
        {
            LoginLogout();

            if (BasicForms.FrmProgressBar.ShowProgressBar) BasicForms.FrmProgressBar.FinishShowProgress();
        }

        private void FrmPortal_FormClosed(object sender, FormClosedEventArgs e)
        {
            LocalSettings.HeThong.TenTruyCapHienTai = "";
            LocalSettings.HeThong.PasswordHienTai = "";
            LocalSettings.HeThong.Save2File();
        }
    }
}
